//
//  HttpVideoDownload.m
//  IM_LearningGYDF
//
//  Created by gydf on 16/3/21.
//  Copyright © 2016年 mac. All rights reserved.
//

#import "HttpVideoDownload.h"
#import "NSString+MD5.h"
@interface HttpVideoDownload()<NSURLSessionDelegate>
{
    NSURLSession *_session;
    NSString *_url;
}
@end

@implementation HttpVideoDownload

+ (HttpVideoDownload *)defaultDownload{
    static HttpVideoDownload *download = nil;
    static dispatch_once_t once = 0;
    //考虑线程安全
    dispatch_once(&once, ^{
        if (download == nil) {
            download = [[self alloc] init];

        }
    });
    return download;
}

- (instancetype)init{
    if (self=[super init]) {
        _urlArr=[NSMutableArray new];
        _progressArr=[NSMutableArray new];
    }
    return self;
}


//- (NSString *)resumeDataPath:(NSURL *)url{
//    // 获得保存续传数据的文件名字
//    NSString *fileName = [NSString stringWithFormat:@"%@~resume",url.absoluteString];
//    // 获得全路径
//    NSString *resumePath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];
//    NSLog(@"保存续传数据的路径 = %@",resumePath);
//    return resumePath;
//}
//获取文件的全路径
- (NSString *)resumeDataPath:(NSURL *)url{
    // 获得保存续传数据的文件名字
    NSString *fileName = [NSString stringWithFormat:@"%@~resume",url.absoluteString.MD5Hash];
    // 获得全路径
    NSString *resumePath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];
    NSLog(@"保存续传数据的路径 = %@",resumePath);
    return resumePath;
}
/**
 *  根据url加载续传数据
 */
- (NSData *)loadResumeData:(NSString *)url{
    // 获得续传数据保存的路径
    NSString *filePath = [self resumeDataPath:[NSURL URLWithString:url]];
    return [NSData dataWithContentsOfFile:filePath];
}
/**
 *  开始下载
 */
- (void)startWithURL:(NSString *)url {
    if ([_urlArr containsObject:url]) {
        return;
    }
    [_urlArr addObject:url];
    // 从沙盒中加载续传数据
    NSData *data = [self loadResumeData:url];
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    if (data == nil) { // 没有续传数据
        // 使用代理，就不能使用全局session
        // 一旦提供了 completionHandler 回调，代理方法不会被触发。
        _downloadTask=[_session downloadTaskWithURL:[NSURL URLWithString:url]];
    } else {    // 有续传数据
        // 根据续传数据发起下载任务，那么任务的下载就从续传数据指定的位置开始下载
        _downloadTask = [_session downloadTaskWithResumeData:data];
    }
    //[_downloadTaskArr addObject:downloadTask];
    // 继续任务
    _url=url;
    [_downloadTask resume];

}

/**
 *  暂停下载
 */
- (void)pauseWithURL:(NSString *)url {
    // resumeData:续传数据,本质一个plist文件
    if ([_urlArr containsObject:url]) {
        //NSInteger num=[_urlArr indexOfObject:url];
        //NSURLSessionDownloadTask *downloadTask=_downloadTaskArr[num];
        [_downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
            NSLog(@"暂停下载 = %zd",resumeData.length);
            // 记录续传数据
            //self.resumeData = resumeData;
            
            // 清空下载任务
           // downloadTask = nil;
            // 将续传数据写入文件中
            [resumeData writeToFile:[self resumeDataPath:[NSURL URLWithString:url]] atomically:YES];
        }];
        //[_downloadTaskArr removeObject:downloadTask];
    }

}

- (void)resumeWithURL:(NSString *)url {
//    if (self.resumeData == nil) {
//        NSLog(@"没有续传数据");
//        return;
//    }
//    for (NSString *url in _urlArr) {
//        [self pauseWithURL:url];
//    }
    if ([_urlArr containsObject:url]) {
        //NSInteger num=[_urlArr indexOfObject:url];
//        NSURLSessionDownloadTask *downloadTask=nil;
        // 根据续传数据发起下载任务，那么任务的下载就从续传数据指定的位置开始下载
        _downloadTask = [_session downloadTaskWithResumeData:[self loadResumeData:url]];
        _url=url;
        // 继续任务
        [_downloadTask resume];
        //[_downloadTaskArr addObject:downloadTask];
    }else{
        if (_urlArr.count>0) {
            [_urlArr addObject:url];
        }else{
            [self startWithURL:url];
        }
    }

}
/**
 *  下载完成回调 -- 必须实现
 *
 *  @param session      会话
 *  @param downloadTask 下载任务
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
    NSLog(@"下载完成 = %@",location);
    
    // 当任务执行完成后销毁会话
    //[_session finishTasksAndInvalidate];
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    // response.suggestedFilename ： 建议使用的文件名，一般跟服务器端的文件名一致
    NSString *file = [caches stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
    
    // 将临时文件剪切或者复制Caches文件夹
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    // AtPath : 剪切前的文件路径
    // ToPath : 剪切后的文件路径
    [mgr moveItemAtPath:location.path toPath:file error:nil];
//    if ([_downloadTaskArr containsObject:downloadTask]) {
//        unsigned long int num=[_downloadTaskArr indexOfObject:downloadTask];
//        [_urlArr removeObjectAtIndex:num];
//        //[_downloadTaskArr removeObjectAtIndex:num];
//    }
    if ([_urlArr containsObject:_url]) {
        [_urlArr removeObject:_url];
    }
    if (_urlArr.count>0) {
        [self resumeWithURL:_urlArr[0]];
    }
    
}


/**
 *  @param bytesWritten              本次下载的字节数
 *  @param totalBytesWritten         已经下载的字节数
 *  @param totalBytesExpectedToWrite 文件总字节数
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    // 计算进度
//    CGFloat progress = (CGFloat)totalBytesWritten / totalBytesExpectedToWrite;
//    NSLog(@"%f",progress);
//    if (self.myBlock) {
//        self.myBlock(totalBytesWritten,totalBytesExpectedToWrite,progress);
//    }
//    NSInteger num=[_urlArr indexOfObject:_url];
//    UILabel *label=_progressArr[num];
//    label.text=[NSString stringWithFormat:@"%.2f%%",progress*100];
//    self.progressView.progress = progress;
//    
}


@end
